//mod ch_034_find_the_first_palindrome__hard;
//mod ch_035_finite_state_automation__hard;
mod ch_036_maze_solver__advance;

fn main() {
    // let maze = vec![
    //     vec!['S', '.', '#', '#', '#'],
    //     vec!['#', '.', '#', '.', '.'],
    //     vec!['#', '.', '.', '.', '#'],
    //     vec!['#', '#', '#', '.', '#'],
    //     vec!['#', '#', '#', 'E', '#'],
    // ];

    // let maze = vec![
    //     vec!['S', '.', '#', '#', '#'],
    //     vec!['#', '.', '#', '.', '.'],
    //     vec!['#', '.', '.', '.', '#'],
    //     vec!['#', '.', '#', '.', '#'],
    //     vec!['#', '.', 'E', '.', '#'],
    // ];

    //let maze = vec![vec!['S', '.'], vec!['#', 'E']];

    //let maze = vec![vec!['S', '.', '.', '.', 'E']];

    let maze = vec![
        vec!['S', '.', '#', '#', '#', '.'],
        vec!['#', '.', '#', '.', '.', '.'],
        vec!['#', '.', '.', '.', '#', '.'],
        vec!['#', '.', '#', '.', '.', '.'],
        vec!['#', '.', '#', '.', '#', '.'],
        vec!['#', '.', '.', '.', '.', 'E'],
    ];

    let start = (0, 0);
    let end = (5, 5);

    let path = ch_036_maze_solver__advance::solve_maze(maze, start, end);
    println!("{:?}", path);
    // assert_eq!(
    //     path,
    //     vec![
    //         (0, 0), // starting point
    //         (0, 1), // right
    //         (1, 1), // down
    //         (2, 1), // down
    //         (2, 2), // right
    //         (2, 3), // right
    //         (3, 3), // down
    //         (4, 3)  // down
    //     ]
    // );

    // println!("{}", true & false);
    // println!("{}", false & false);
    // println!("{}", true & true);
    // println!("{}", 1 & 0);
    // println!("{}", 0 & 0);
    // println!("{}", 1 & 1);
    //println!("{}", true & false);
}
